/**
 * ? 描述一个可选参数：
 * 在很多时候，会希望函数的参数可以更灵活，比如它不一定全都必传，当不传入参数时函数会使用此参数的默认值。
 * 正如在对象类型中使用 ? 描述一个可选属性一样，
 * 在函数类型中我们也使用 ? 描述一个可选参数
 * 
 * 需要注意的是：
 * 1、可选参数必须位于必选参数之后
 * 2、可以直接将可选参数与默认值合并，但此时就不能够使用 ? 了
*/
// 在函数逻辑中注入可选参数默认值
function foo1(name: string, age?: number): number {
    const inputAge = age || 18; // 或使用 age ?? 18
    return name.length + inputAge
}

// 直接为可选参数声明默认值，既然都有默认值，那肯定是可选参数啦
function foo2(name: string, age: number = 18): number {
    const inputAge = age;
    return name.length + inputAge
}

/**
 * 对于 rest 参数的类型标注也比较简单，
 * 由于其实际上是一个数组，使用数组类型进行标注：
 * 也可以使用 元祖类型 进行标注：
*/

//对于 any 类型，先可以简单理解为它包含了一切可能的类型
function foo3(arg1: string, ...rest: any[]) { }

//使用 元祖类型 进行标注
function foo4(arg1: string, ...rest: [number, boolean]) { }
foo4("hanxuming", 18, true)


//export {}：解决“无法重新声明块范围变量”错误提示问题
export { }